package com.cs.beneficios.business.entity;

import com.cs.beneficios.business.model.AreaVO;
//import com.cs.beneficios.business.model.RepAtributoVO;
//import com.cs.beneficios.business.model.RepBeneficioOtorgadoVO;

//import com.cs.beneficios.business.model.ReportComunaVO;
//import com.cs.beneficios.business.model.ReporteTotalBeneficiosOtorVO;
//import com.cs.beneficios.business.model.ReporteTotalComunaVO;
import com.cs.beneficios.business.model.ReporteTotalProgramasVO;
//import com.cs.beneficios.business.model.VflexVO;
import com.cs.beneficios.common.ConnectionFactory;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.DecimalFormat;

import java.util.ArrayList;
import java.util.Collection;
//import java.util.LinkedList;
//import java.util.List;

public class ReporteTotalProgramasDAO {
	/**
	 * Conexion a la base de datos.
	 */
	private Connection conn = null;
	private ConnectionFactory cf;

	private final DecimalFormat dF = new DecimalFormat("###,###,###,###,###.##");

	/**
	 * Constructor que inicializa la conexion con la base de datos.
	 * 
	 * @param conn
	 *            Conexion con la base de datos.
	 */

	public ReporteTotalProgramasDAO(ConnectionFactory cf) {
		this.cf = cf;
		try {
			this.conn = this.cf.getConnection();
		} catch (SQLException e) {
		}
	}

	public Collection GetTotalProgSubpro(ReporteTotalProgramasVO criterea)
			throws SQLException {
		String query = "";
		String query2 = "";
		if ((Object) criterea.getDesde() != ""
				&& (Object) criterea.getHasta() != "") {
			query = "SELECT prog.NOMBRE nombre_programa, sub.NOMBRE nombre_subprograma, "
					+ "Fcs_Ben_Cantidad_Beneficios(sub.CODIGO,'"
					+ criterea.getDesde()
					+ "','"
					+ criterea.getHasta()
					+ "') cantidad_beneficios, "
					+ "Fcs_Ben_ValorTotal_Beneficios(sub.CODIGO,'"
					+ criterea.getDesde()
					+ "','"
					+ criterea.getHasta()
					+ "') valor_beneficios, "
					+ "Fcs_Ben_Cantidad_Beneficiarios(sub.CODIGO,'"
					+ criterea.getDesde()
					+ "','"
					+ criterea.getHasta()
					+ "') cantidad_beneficiarios, "
					+ "subarea.NOMBRE nombre_subarea, area.NOMBRE nombre_area, "
					+ "fcs_ben_subtotal_programa(prog.CODIGO,"
					+ criterea.getCodeSubprograma()
					+ ") subtotal, "
					+ "fcs_ben_cantidad_subtotal(prog.CODIGO,"
					+ criterea.getCodeSubprograma()
					+ ",'"
					+ criterea.getDesde()
					+ "','"
					+ criterea.getHasta()
					+ "') cantidad_subtotal, "
					+ "NVL(fcs_ben_valor_subtotal(prog.CODIGO,"
					+ criterea.getCodeSubprograma()
					+ ",'"
					+ criterea.getDesde()
					+ "','"
					+ criterea.getHasta()
					+ "'),0) valor_subtotal "
					+ "FROM TCS_BEN_AREA area,	TCS_BEN_AREA subarea, TCS_BEN_PROGRAMA prog, TCS_BEN_SUBPROGRAMA sub "
					+ "WHERE area.CODIGO = prog.AREA_CODIGO "
					+ "AND subarea.CODIGO = sub.AREA_CODIGO "
					+ "AND prog.CODIGO = sub.PRG_CODIGO AND prog.vigencia='A' and sub.vigencia='A' ";
		} else {
			query = "SELECT prog.NOMBRE nombre_programa, sub.NOMBRE nombre_subprograma, "
					+ "Fcs_Ben_Cantidad_Beneficios(sub.CODIGO,null,null) cantidad_beneficios, Fcs_Ben_ValorTotal_Beneficios(sub.CODIGO,null,null) valor_beneficios, "
					+ "Fcs_Ben_Cantidad_Beneficiarios(sub.CODIGO,null,null) cantidad_beneficiarios, subarea.NOMBRE nombre_subarea, area.NOMBRE nombre_area, "
					+ "fcs_ben_subtotal_programa(prog.CODIGO,"
					+ criterea.getCodeSubprograma()
					+ ") subtotal, fcs_ben_cantidad_subtotal(prog.CODIGO,"
					+ criterea.getCodeSubprograma()
					+ ",null,null) cantidad_subtotal, "
					+ "NVL(fcs_ben_valor_subtotal(prog.CODIGO,"
					+ criterea.getCodeSubprograma()
					+ ",null,null),0) valor_subtotal "
					+ "FROM TCS_BEN_AREA area,	TCS_BEN_AREA subarea, TCS_BEN_PROGRAMA prog, TCS_BEN_SUBPROGRAMA sub "
					+ "WHERE area.CODIGO = prog.AREA_CODIGO "
					+ "AND subarea.CODIGO = sub.AREA_CODIGO "
					+ "AND prog.CODIGO = sub.PRG_CODIGO AND prog.vigencia='A' and sub.vigencia='A' ";
		}

		query2 = "SELECT COUNT(DISTINCT bot.ben_codigo) cantidad_total_beneficiarios\n"
				+ "FROM tcs_ben_beneficio_otorgado bot, tcs_ben_subprograma sub, \n"
				+ "tcs_ben_programa prog, tcs_ben_area area\n"
				+ "WHERE bot.sbpr_codigo = sub.codigo\n"
				+ "AND sub.prg_codigo = prog.codigo\n"
				+ "AND prog.area_codigo = area.codigo\n"
				+ "AND prog.vigencia='A' AND sub.vigencia='A'";

		if ((Object) criterea.getCodeArea() != null) {
			query += " and area.CODIGO = " + criterea.getCodeArea();
			query2 += " and area.CODIGO = " + criterea.getCodeArea();
		}
		if ((Object) criterea.getCodeSubprograma() != null) {
			query += " and sub.CODIGO = " + criterea.getCodeSubprograma();
			query2 += " and sub.CODIGO = " + criterea.getCodeSubprograma();
		}
		if ((Object) criterea.getCodePrograma() != null) {
			query += " and prog.CODIGO = " + criterea.getCodePrograma();
			query2 += " and prog.CODIGO = " + criterea.getCodePrograma();
		}
		if ((Object) criterea.getDesde() != ""
				&& (Object) criterea.getHasta() != "") {
			query2 += " and bot.FECHA_BENEFICIO between to_date('"
					+ criterea.getDesde() + "','dd/mm/yyyy') and to_date('"
					+ criterea.getHasta() + "','dd/mm/yyyy')";
		}
		/*
		 * if((Object)criterea.getDesde() != "" && (Object)criterea.getHasta()
		 * != "") { query +=
		 * " and prog.desde_vigencia >= to_date('"+criterea.getDesde
		 * ()+"','dd/mm/rrrr') and prog.hasta_vigencia <= TO_DATE('"
		 * +criterea.getHasta()+"','dd/mm/rrrr')"; }
		 * 
		 * if((Object)criterea.getDesde() != "" && (Object)criterea.getHasta()
		 * == "") { query +=
		 * " and prog.desde_vigencia >= TO_DATE('"+criterea.getDesde
		 * ()+"','dd/mm/rrrr')"; } if((Object)criterea.getDesde() == "" &&
		 * (Object)criterea.getHasta() != "") { query +=
		 * " and prog.hasta_vigencia <= TO_DATE('"
		 * +criterea.getHasta()+"','dd/mm/rrrr')"; }
		 */

		query += " ORDER BY area.NOMBRE, prog.NOMBRE";
		// System.out.println(query);

		ResultSet rst = null;
		ResultSet rst2 = null;
		ArrayList lTotalProg = new ArrayList();
		rst = cf.getRecordsRset(query, null, conn);
		rst2 = cf.getRecordsRset(query2, null, conn);
		ReporteTotalProgramasVO objprogramas = null;

		String subtotal = null;
		String cantidad_subtotal = null;
		String valor_subtotal = null;
		String strProg = null;

		long totalProgramas = 0;
		long totalSubprogramas = 0;
		long cantidad_total = 0;
		long valor_total = 0;

		boolean bContinue = false;
		if (rst.next()) {
			strProg = rst.getString("nombre_programa");
			totalProgramas += 1;

			totalSubprogramas += 1;
			cantidad_total += rst.getLong("cantidad_beneficios");
			valor_total += rst.getLong("valor_beneficios");

			objprogramas = new ReporteTotalProgramasVO();
			objprogramas.setNombrePrograma(rst.getString("nombre_programa"));
			objprogramas.setNombreSubprograma(rst
					.getString("nombre_subprograma"));
			objprogramas.setCantidadBeneficiarios(rst
					.getString("cantidad_beneficiarios"));
			objprogramas.setCantidadBeneficios(new Long(rst
					.getString("cantidad_beneficios")));
			objprogramas.setValorBeneficios(new Long(rst
					.getString("valor_beneficios")));
			objprogramas.setNombreSubarea(rst.getString("nombre_subarea"));
			objprogramas.setNombreArea(rst.getString("nombre_area"));
			subtotal = rst.getString("subtotal");
			cantidad_subtotal = rst.getString("cantidad_subtotal");
			valor_subtotal = rst.getString("valor_subtotal");

			bContinue = rst.next();

			if ((bContinue && !rst.getString("nombre_programa").equals(strProg))
					|| !bContinue) {
				if (bContinue) {
					strProg = rst.getString("nombre_programa");
					totalProgramas += 1;
				}
				lTotalProg.add(objprogramas);
				objprogramas = null;

				objprogramas = new ReporteTotalProgramasVO();
				objprogramas.setNombrePrograma("");
				objprogramas.setNombreSubprograma(subtotal.toString());
				objprogramas.setCantidadBeneficios(new Long(cantidad_subtotal));
				objprogramas.setValorBeneficios(new Long(valor_subtotal));
				objprogramas.setNombreSubarea("");
				objprogramas.setNombreArea("SUBTOTAL:");
			}

			lTotalProg.add(objprogramas);

			objprogramas = null;
		}

		while (bContinue) {
			totalSubprogramas += 1;
			cantidad_total += rst.getLong("cantidad_beneficios");
			valor_total += rst.getLong("valor_beneficios");

			objprogramas = new ReporteTotalProgramasVO();
			objprogramas.setNombrePrograma(rst.getString("nombre_programa"));
			objprogramas.setNombreSubprograma(rst
					.getString("nombre_subprograma"));
			objprogramas.setCantidadBeneficiarios(rst
					.getString("cantidad_beneficiarios"));
			objprogramas.setCantidadBeneficios(new Long(rst
					.getString("cantidad_beneficios")));
			objprogramas.setValorBeneficios(new Long(rst
					.getString("valor_beneficios")));
			objprogramas.setNombreSubarea(rst.getString("nombre_subarea"));
			objprogramas.setNombreArea(rst.getString("nombre_area"));
			subtotal = rst.getString("subtotal");
			cantidad_subtotal = rst.getString("cantidad_subtotal");
			valor_subtotal = rst.getString("valor_subtotal");

			bContinue = rst.next();

			if ((bContinue && !rst.getString("nombre_programa").equals(strProg))
					|| !bContinue) {
				if (bContinue) {
					strProg = rst.getString("nombre_programa");
					totalProgramas += 1;
				}
				lTotalProg.add(objprogramas);
				objprogramas = null;

				objprogramas = new ReporteTotalProgramasVO();
				objprogramas.setNombrePrograma("");
				objprogramas.setNombreSubprograma(subtotal.toString());
				objprogramas.setCantidadBeneficios(new Long(cantidad_subtotal));
				objprogramas.setValorBeneficios(new Long(valor_subtotal));
				objprogramas.setNombreSubarea("");
				objprogramas.setNombreArea("SUBTOTAL:");
			}

			lTotalProg.add(objprogramas);
			objprogramas = null;
		}

		// totales..
		objprogramas = new ReporteTotalProgramasVO();
		// objprogramas.setNombrePrograma(cantidad_total + "");
		// formato para totales bot (en columna programa)
		objprogramas.setNombrePrograma(dF.format(cantidad_total));

		objprogramas.setNombreSubprograma("PROGRAMAS:");
		objprogramas.setCantidadBeneficiarios(new Long(totalProgramas)
				.toString());
		objprogramas.setValorBeneficios("");
		objprogramas.setNombreSubarea("Beneficios Otorgados:");
		objprogramas.setNombreArea("TOTAL:");

		lTotalProg.add(objprogramas);
		objprogramas = null;

		objprogramas = new ReporteTotalProgramasVO();
		// objprogramas.setNombrePrograma(valor_total + "");
		// formato para totales valor bot(en columna programa)
		objprogramas.setNombrePrograma(dF.format(valor_total));
		objprogramas.setNombreSubprograma("SUBPROGRAMAS:");
		objprogramas.setCantidadBeneficiarios(new Long(totalSubprogramas)
				.toString());
		objprogramas.setValorBeneficios("");
		objprogramas.setNombreSubarea("Valor Beneficios Otorgados:");
		objprogramas.setNombreArea("");

		lTotalProg.add(objprogramas);
		objprogramas = null;

		objprogramas = new ReporteTotalProgramasVO();
		rst2.next();
		// objprogramas.setNombrePrograma(rst2.getString("cantidad_total_beneficiarios"));
		// formato para totales beneficiarios (en columna programa)

		objprogramas.setNombrePrograma(dF.format(Long.parseLong(rst2
				.getString("cantidad_total_beneficiarios"))));
		objprogramas.setCantidadBeneficiarios("");
		objprogramas.setValorBeneficios("");
		objprogramas.setNombreSubarea("Beneficiarios:");
		objprogramas.setNombreArea("");

		lTotalProg.add(objprogramas);
		objprogramas = null;

		rst.close();
		rst2.close();
		conn.close();
		return lTotalProg;
	}

	public Collection GetSecretarias() throws SQLException {
		String query = "SELECT NOMBRE, CODIGO FROM TCS_BEN_AREA "
				+ "WHERE AREA_CODIGO IS NULL";

		ResultSet rst = null;
		ArrayList lareas = new ArrayList();
		rst = cf.getRecordsRset(query, null, conn);
		AreaVO objarea = null;

		while (rst.next()) {
			objarea = new AreaVO();
			objarea.setCode(new Long(rst.getString("CODIGO")));
			objarea.setNombre(rst.getString("NOMBRE"));
			lareas.add(objarea);
			objarea = null;
		}

		rst.close();
		return lareas;
	}

	/************************************************
	 * Metodo para provisional para recuprar los filtros utilizados en el
	 * reporte
	 * *********************************************/
	public ReporteTotalProgramasVO getFilters(ReporteTotalProgramasVO objRtpVO)
			throws SQLException {
		String strQuery = null;
		ResultSet rst = null;

		if (objRtpVO.getCodeArea() != null) {
			strQuery = "SELECT NOMBRE" + " FROM TCS_BEN_AREA"
					+ " WHERE CODIGO = " + objRtpVO.getCodeArea();
			rst = cf.getRecordsRset(strQuery, null, conn);
			rst.next();

			objRtpVO.setNombreArea(rst.getString("NOMBRE"));
		}
		if (objRtpVO.getCodePrograma() != null) {
			strQuery = "SELECT NOMBRE" + " FROM TCS_BEN_PROGRAMA"
					+ " WHERE CODIGO = " + objRtpVO.getCodePrograma();
			rst = cf.getRecordsRset(strQuery, null, conn);
			rst.next();

			objRtpVO.setNombrePrograma(rst.getString("NOMBRE"));
		}
		if (objRtpVO.getCodeSubprograma() != null) {
			strQuery = "SELECT NOMBRE" + " FROM TCS_BEN_SUBPROGRAMA"
					+ " WHERE CODIGO = " + objRtpVO.getCodeSubprograma();
			rst = cf.getRecordsRset(strQuery, null, conn);
			rst.next();

			objRtpVO.setNombreSubprograma(rst.getString("NOMBRE"));
		}
		if (rst != null)
			rst.close();

		return objRtpVO;
	}

	public Connection getConn() {
		return conn;
	}
}